package com.heima.behavior.interceptor;

import com.heima.model.user.pojos.ApUser;
import com.heima.utils.common.AppJwtUtil;
import com.heima.utils.threadLocal.ApUserThreadLocalUtil;
import io.jsonwebtoken.Claims;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Optional;

/**
 * springmvc拦截器
 * 目的是为了获取token,并解析，然后把用户信息存入到threadLocal对象中
 */
public class ApTokenInterceptor implements HandlerInterceptor {
    /**
     * 在执行具体的业务方法之前执行该方法
     * @param request  请求对象
     * @param response 响应对象
     * @param handler
     * @return true表示放行，false表示拦截
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1.从请求头对象中获取token
        String token = request.getHeader("token");

        //2.校验token是否有值，以及是否有效
        Optional<String> optional = Optional.ofNullable(token);
        if(optional.isPresent()){//如果存在的话
            //3.如果有效，则取出用户信息，
            Claims claimsBody = AppJwtUtil.getClaimsBody(token);
            Object id = claimsBody.get("id");
            //然后保存到ThreadLocal对象中
            ApUser apUser=new ApUser();
            apUser.setId((Integer) id);
            ApUserThreadLocalUtil.setApUser(apUser);
        }

        //4.放行
        return true;
    }

    /**
     * 在执行具体的业务方法之后执行该方法
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        ApUserThreadLocalUtil.delApUser();
    }
}
